计算移动平均的函数 您所在的位置:网站首页 excel 移动平均是怎么做出来的 计算移动平均的函数

计算移动平均的函数

2024-07-05 14:38| 来源: 网络整理| 查看: 265

今天我们编写一个计算移动平均的函数。

移动平均

移动平均,有时候称为滚动平均,是一种很流行的数据分析方法。取得过去n期的数据计算其平均值,从而消除数据中的偶然因素影响,得到较为长期的趋势。

计算方法很简单。比如,

这个表中A:B列是从2000年到2030年的数据,C列是移动平均。这里我们选取的是3年移动平均,所以,C2,C3单元格中是空白。

从C4开始,写公式:

=AVERAGE(B2:B4)

然后拖拽填充整列即可。

动态数组公式

这个公式不复杂。不过需要手动填充,是一种类似于辅助列的形式。如果是希望直接得到结果,就得考虑写一个动态数组公式了。

这里的思路就是循环,循环B列数据区域,对循环到的每一行,计算从当前行往上3行的平均值:

这个循环怎么实现呢?

由于我们要知道当前循环到所在行的索引号,最直接考虑的就是MAKEARRAY函数了。

我们可以使用MAKEARRAY函数生成一个单列的结果集,行数跟数据区域一样多。

=LET( data, B2:B32, MAKEARRAY(ROWS(data), 1, LAMBDA(r,c, IF( r < 3, '', AVERAGE(INDEX(data, r - 2): INDEX(data, r)) ) ) ))

这个函数可以一次性返回一个结果数组,得到所有的移动平均值,

这里我们判断行号,如果行号小于3,就返回空字符串,否则,就计算从数据区域data当前行往前3行的区域的平均值。

注意,我们这里使用了INDEX函数返回区域最上方和最下方的单元格:

INDEX(data, r - 2): INDEX(data, r)

这两个公式返回的是一个单元格引用,所以可以直接使用生成一个区域。

自定义函数

如果需要重复使用这个功能,可以写成自定义函数。这样做还有一个好处,那就是计算不同期数的移动平均变得简单了。不需要该公式内部的代码,就是引用时简单定义期数就可以了。

下面的代码定义了自定义函数:

/** 计算data的移动平均,n是期数*/RollingAverage = LAMBDA(data, n, MAKEARRAY(ROWS(data), 1, LAMBDA(r,c, IF( r < n, '', AVERAGE(INDEX(data, r - n + 1): INDEX(data, r)) ) ) ))

逻辑是一样的。

有两个参数,一个是data,表示数据区域,另外一个是n,表示期数。

IF函数的条件要判断行号,小于n时不计算。

另外计算移动平均时需要根据n往上偏移找到最上方的单元格。

可以计算三期的移动平均,

也可以计算5期的移动平均,

缺陷

这个自定义函数很好用,当然还有扩展的余地。

不过最关键的是这个函数有缺陷:

它只能处理对单元格区域的移动平均计算,data参数只能使用单元格区域引用。不能使用数组。

在稍微复杂一点的场合中,这个函数就不能用了。

比如,原始数据是包括不同产品的历年数据。我们需要根据不同产品生成移动平均。那么公式中就需要将不同产品的数据筛选出来,作为参数调用这个自定义函数。

但是这时候,这个筛选出来的数据其实是一个数组。

公式用不了!

我们需要修改优化一下。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有